package com.taotao.sso.service.impl;

import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.alibaba.dubbo.common.utils.StringUtils;
import com.taoato.sso.service.JedisClient;
import com.taoato.sso.service.UserLoginService;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.util.JsonUtils;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;

@Service
public class UserLoginServiceImpl implements UserLoginService {

	@Autowired
	private TbUserMapper userMapper;

	@Autowired
	private JedisClient jedisClient;

	@Value("${USER_INFO_KEY}")
	private String USER_INFO;

	@Value("${EXPIRE_TIME_KEY}")
	private Integer EXPIRE_TIME;

	@Override
	public TaotaoResult userLogin(String username, String password) {
		if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
			return TaotaoResult.build(400, "用户名和密码不为空！");
		}
		// 校验用户名
		TbUserExample example = new TbUserExample();
		example.createCriteria().andUsernameEqualTo(username.trim());
		List<TbUser> users = userMapper.selectByExample(example);
		if (users.size() == 0) {
			return TaotaoResult.build(400, "用户名或密码错误！");
		}

		// 校验密码
		TbUser user = users.get(0);
		// 先加密密码再比较
		String md5DigestAsHex = DigestUtils.md5DigestAsHex(password.getBytes());
		if (!md5DigestAsHex.equals(user.getPassword().trim())) {// 表示用户的密码不正确
			return TaotaoResult.build(400, "用户名或密码错误");
		}
		// 成功，生成token
		// 6.生成token : uuid生成 ，还需要设置token的有效性期来模拟session 用户的数据存放在redis
		// (key:token,value:用户的数据JSON)
		String token = UUID.randomUUID().toString();
		// 放进缓存中
		user.setPassword(null);
		jedisClient.set(USER_INFO + ":" + token, JsonUtils.objectToJson(user));
		// 设置过期时间半小时
		jedisClient.expire(USER_INFO + ":" + token, EXPIRE_TIME);
		// 到controller把token放进cookie中
		return TaotaoResult.ok(token);
	}

	@Override
	public TaotaoResult getToken(String token) {
		//获得token的身份信息
	    String jsonstr = jedisClient.get(USER_INFO + ":" + token);
	    //判断是否为空
	    if(StringUtils.isBlank(jsonstr)) {
	    	return TaotaoResult.build(400, "用户已过期");
	    }
	    //重新设置过期时间
	    jedisClient.expire(USER_INFO + ":" + token, EXPIRE_TIME);
	    //返回包含用户信息的taotaoResult
		return TaotaoResult.ok(JsonUtils.jsonToPojo(jsonstr, TbUser.class));
	}
}
